home *** CD-ROM | disk | FTP | other *** search
- /* very simple XFCN to grab a chunk of text out of a text file 'filenum'
- * (file must be already opened; pass the refNum to this function),
- * centered on a chosen byte 'target', of a chosen 'size' in bytes
- * ... if the request extends beyond the boundaries of the actual file,
- * just truncate it so that it fits ... call it as:
- *
- * grabText (target, size, filenum)
- *
- * and when it returns it will give the chunk of text back as an answer.
- * Note that Hypercard doesn't want more than 30kB in any single field,
- * but this function doesn't respect that limit. Note that if the 'text'
- * file contains '\0' characters, HyperCard will probably be fooled and
- * only accept the chunk of text up to the first '\0' encountered. Note
- * that the only response to an error is to beep and return empty-handed.
- *
- * For use on the alternative text card on ^z's TEXAS stack.... an XFCN
- * numbered 2088 or so....
- *
- * 871229 - ^z
- */
-
- #include <MacTypes.h>
- #include <FileMgr.h>
- #include <HyperXCmd.h>
-
- pascal void main (XCmdBlockPtr paramPtr);
- long atol (char *s);
-
- pascal void main (paramPtr)
- XCmdBlockPtr paramPtr;
- {
- int refNum, err;
- long target, size, offset, bytes;
- Handle answer;
-
- if (paramPtr->paramCount != 3)
- {
- SysBeep (10);
- return;
- }
- target = atol (*(paramPtr->params[0]));
- size = atol (*(paramPtr->params[1]));
- refNum = atol (*(paramPtr->params[2]));
- if (target < 0 || size < 1 || refNum == 0)
- {
- SysBeep (10);
- return;
- }
- offset = target - size / 2;
- if (offset < 0)
- offset = 0;
- bytes = size;
- answer = NewHandle (size + 1);
- if (answer == 0)
- {
- SysBeep (10);
- return;
- }
- HLock (answer);
- SetFPos (refNum, fsFromStart, offset);
- err = FSRead (refNum, &bytes, *answer);
- if (err != noErr && err != eofErr)
- {
- SysBeep (10);
- return;
- }
- *(*answer + bytes) = '\0';
- paramPtr->returnValue = answer;
- HUnlock (answer);
- return;
- }
-
-
- /* function to convert alphabetic string to a long integer ... from LSC
- * library.... simplified to avoid using isspace() & isdigit() ....
- */
-
- long atol (s)
- register char *s;
- {
- register char signflag = 0;
- register long r = 0;
-
- while ((*s == ' '))
- s++;
-
- if (*s == '-')
- {
- signflag = 1;
- s++;
- }
- else if (*s == '+')
- s++;
-
- while (*s >= '0' && *s <= '9')
- r = r * 10 + (*s++ - '0');
-
- return (signflag ? -r : r);
- }
-
-
-